#include <stdio.h>
#include <unistd.h>
#include <time.h>
#include <sys/time.h>

/*
1. gettimeofday()
gettimeofday() 函数用于获取当前的时间，返回自 1970 年 1 月 1 日 00:00:00 UTC（即 Unix 时间纪元）以来的秒数和微秒数。它的精度通常为微秒（百万分之一秒）。

函数原型
#include <sys/time.h>
int gettimeofday(struct timeval *tv, struct timezone *tz);

tv：这是一个指向 struct timeval 类型的指针，struct timeval 定义如下：
struct timeval {
    time_t      tv_sec;   // 秒数 
    suseconds_t tv_usec;  // 微秒数 
};

tv_sec 表示自 Unix 纪元以来的秒数，tv_usec 表示自秒开始后的微秒数（范围是 0 到 999,999 微秒）。
tz：该参数已经不再使用，通常传递 NULL。

返回值
成功时返回 0。
失败时返回 -1，并且 errno 被设置为错误代码。

2. clock_gettime()
clock_gettime() 是一个更现代的时间获取函数，提供了更高精度和更多控制选项。它可以用于获取不同的时钟（比如系统时钟、CPU 时钟等）。

函数原型
#include <time.h>
int clock_gettime(clockid_t clk_id, struct timespec *tp);

clk_id：指定所需时钟的类型，常用的时钟类型包括：
CLOCK_REALTIME：系统的实时时钟，表示当前时间，类似于 gettimeofday()。
CLOCK_MONOTONIC：单调时钟，表示系统启动后的时间，不受系统时间调整（例如 NTP 校准）影响。
CLOCK_PROCESS_CPUTIME_ID：进程的 CPU 时间。
CLOCK_THREAD_CPUTIME_ID：当前线程的 CPU 时间。

tp：指向 struct timespec 的指针，struct timespec 定义如下：
struct timespec {
    time_t tv_sec;      // 秒数
    long   tv_nsec;     // 纳秒数
};
tv_sec 表示自纪元以来的秒数，tv_nsec 表示自秒开始后的纳秒数（范围是 0 到 1,000,000,000 纳秒）。

返回值
成功时返回 0。
失败时返回 -1，并且 errno 被设置为错误代码。
*/
int main(const int argc, const char* argv[])
{
#if 0
    struct timeval start, end;
 
    gettimeofday(&start, NULL); // 记录开始时间
    sleep(1);
    gettimeofday(&end, NULL);   // 记录结束时间

    long time = (end.tv_sec - start.tv_sec) * 1000000 + (end.tv_usec - start.tv_usec); // 微秒为单位
    printf("Read time: %ld microseconds\n", time);  // 打印读取数据的时间
#else
    struct timespec start, end;

    clock_gettime(CLOCK_REALTIME, &start); // 记录开始时间
    sleep(1);
    clock_gettime(CLOCK_REALTIME, &end);   // 记录结束时间

    long time = (end.tv_sec - start.tv_sec) * 1000000000 + (end.tv_nsec - start.tv_nsec); // 纳秒为单位
    printf("Read time: %ld microseconds\n", time);  // 打印读取数据的时间
#endif
    return 0;
}